#include <iostream>
using namespace std;

/*
    父类的同名方法不是虚函数
        (静态联编)
        1.规则：编译器严格按照赋值运算左边的类型去调用相应的方法
        2.C++规定：父类的指针或者引用可以直接指向不同的子类，不需要写强转
    父类的同名方法是虚函数
        (动态联编)
        1.规则：编译器会按照指针或引用的实际类型去调用相应的方法（看右边）
*/

class B
{
public:
    void vf()
    {
        cout << "B" << endl;
    }
};

class D : public B
{
public:
    void vf()
    {
        cout << "D" << endl;
    }
};

int main()
{
    B b, *pb;
    D d, *pd;
    // 父类指针指向父类对象
    pb = &b;
    pb->vf();
    // 父类指针指向子类对象
    pb = &d;
    pb->vf();
    // 子类指针指向父类对象
    pd = (D *)(&b);
    pd->vf();
    // 子类指针指向子类对象
    pd = &d;
    pd->vf();

    return 0;
}